Red Hat System Administration II 8.2
- Написание простых сценариев Bash
- Упражнение под руководством преподавателя: Написание простых сценариев Bash
- Более эффективное выполнение команд с помощью циклов
- Упражнение под руководством преподавателя: Более эффективное выполнение команд с помощью циклов
- Сопоставление текста в выводе команды с регулярными выражениями
- Упражнение под руководством преподавателя: Сопоставление текста в выводе команды с регулярными выражениями
- Открытое практическое занятие: Повышение производительности командной строки
- Краткое содержание
Аннотация
Цель | Более эффективный запуск команд за счет использования расширенных функций командной оболочки Bash, сценариев оболочки и различных утилит, доступных в Red Hat Enterprise Linux |
Задачи |
|
Разделы |
|
Лабораторная работа |
Повышение производительности командной строки |
Задачи
После завершения этого раздела вы сможете автоматизировать последовательности команд с помощью простого сценария командной оболочки.
Создание и выполнение сценариев командной оболочки Bash
Многие распространенные простые задачи системного администрирования выполняются с использованием утилит командной строки. Для более сложных задач часто требуется последовательно выполнить несколько команд с передачей результатов между ними. Используя среду командной оболочки Bash и функции сценариев, можно объединять команды Linux в сценарии командной оболочки для быстрого решения повторяющихся и сложных задач.
В простейшей форме сценарий командной оболочки Bash — это исполняемый файл со списком команд и, возможно, логикой программирования для управления принятием решений по общей задаче. Хорошо составленный сценарий ― это эффективная утилита командной строки, которая может использоваться другими сценариями.
Создание сценариев командной оболочки — очень важный навык для успешного системного администрирования в любой операционной среде. Практический опыт написания сценариев особенно важен в корпоративных средах, где сценарии могут повысить эффективность и точность выполнения рутинных задач.
Чтобы создать сценарий Bash, откройте пустой файл в текстовом редакторе. Хотя подойдет любой редактор, такие продвинутые редакторы, как vim и emacs, понимают синтаксис сценариев Bash и могут выделять команды цветом
. Выделение цветом помогает идентифицировать такие распространенные ошибки, как неправильный синтаксис, непарные кавычки, незакрытые круглые, фигурные и квадратные скобки.
Указание интерпретатора команд
Первая строка сценария начинается с нотации #!
, которая также известна как sh-bang
или she-bang
(по названиям этих двух символов ― sharp
и bang
). Эта двухбайтная нотация (магическое число
), указывает на интерпретируемый сценарий. Синтаксис, идущий за этой нотацией, ― это полностью определенное имя файла интерпретатора команд
, который требуется для обработки строк сценария. Чтобы понять, как указывать типы файлов в Linux с помощью магических чисел
, см. man-страницы file(1) и magic(5) . В файлах сценариев, в которых используется синтаксис сценариев Bash, первая строка начинается следующим образом:
#!/bin/bash
Выполнение сценария командной оболочки Bash
Готовый сценарий командной оболочки должен быть исполняемым, чтобы запускаться как обычная команда. Используйте команду chmod, чтобы добавить разрешение на выполнение. Вместе с ней можно использовать команду chown для смены владельца файла сценария. Предоставляйте разрешение на выполнение только предполагаемым пользователям сценария.
Если поместить сценарий в один из каталогов, указанных в переменной среды PATH
оболочки, можно будет вызывать сценарий оболочки по имени файла, как и любую другую команду. Оболочка использует первую найденную команду с этим именем файла. Старайтесь не использовать существующие имена команд в качестве имени файла сценария оболочки. Кроме того, для вызова сценария оболочки можно ввести путь к сценарию в командной строке. Команда which, за которой идет имя файла исполняемого сценария, отображает путь к выполняемой команде.
[user@host ~]$
which hello
~/bin/hello[user@host ~]$
echo $PATH
/home/user/.local/bin:/home/user/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
Заключение специальных символов в кавычки
Некоторые символы и слова имеют специальное значение в командной оболочке Bash. Однако иногда требуется использовать эти символы буквально, без специальных значений. Для этого используйте один из следующих трех инструментов, чтобы убрать специальное значение (экранировать символ): обратная косая черта (\), одинарные кавычки ('') или двойные кавычки ("").
Escape-символ обратной косой черты убирает специальное значение одного последующего символа. Например, чтобы отобразить строку # не комментарий
с помощью команды echo, символ # не должен интерпретироваться оболочкой Bash специальным образом. Поставьте обратную косую черту перед знаком #.
[user@host ~]$
echo # not a comment
[user@host ~]$
echo \# not a comment
# not a comment
Если необходимо экранировать несколько символов в текстовой строке, используйте escape-символ несколько раз или примените одинарные кавычки (''). Одинарные кавычки сохраняют буквальные значения всех символов, которые в них заключены. Ниже приведен пример использования escape-символа и одинарных кавычек.
[user@host ~]$
echo # not a comment #
[user@host ~]$
echo \# not a comment #
# not a comment[user@host ~]$
echo \# not a comment \#
# not a comment #[user@host ~]$
echo '# not a comment #'
# not a comment #
Двойные кавычки подавляют подстановку имен и развертывание командной оболочки, но допускают подстановку команд и переменных. Подстановка переменных концептуально аналогична подстановке команд, но позволяет использовать необязательный синтаксис фигурных скобок. Ниже приведены примеры использования различных видов кавычек.
Используйте одинарные кавычки, чтобы весь текст интерпретировался буквально. Помимо подавления подстановки имен и развертывания командной оболочки, кавычки служат для командной оболочки указанием, что нужно дополнительно подавить подстановку команд и переменных. Вопросительный знак (?) также является метасимволом
, который требует защиты от развертывания.
[user@host ~]$
var=$(hostname -s); echo $var
host[user@host ~]$
echo "***** hostname is ${var} *****"
***** hostname is host *****[user@host ~]$
echo Your username variable is \$USER.
Your username variable is $USER.[user@host ~]$
echo "Will variable $var evaluate to $(hostname -s)?"
Will variable host evaluate to host?[user@host ~]$
echo 'Will variable $var evaluate to $(hostname -s)?'
Will variable $var evaluate to $(hostname -s)?[user@host ~]$
echo "\"Hello, world\""
"Hello, world"[user@host ~]$
echo '"Hello, world"'
"Hello, world"
Отображение вывода сценария командной оболочки
Команда echo отображает произвольный текст, для чего необходимо передать этот текст в команду в виде аргумента. По умолчанию текст отображается в стандартном потоке вывода (STDOUT), но его также можно направить в стандартный поток ошибок (STDERR). В следующем простом сценарии Bash команда echo отображает сообщение "Hello, world
" в стандартном потоке вывода.
[user@host ~]$
cat ~/bin/hello
#!/bin/bash echo "Hello, world"[user@host ~]$
hello
Hello, world
Примечание
Этот пользователь может просто ввести hello в командной строке, поскольку каталог ~/bin
(/home/user/bin
) находится в пользовательской переменной PATH
и сценарий hello
в нем является исполняемым. Командная оболочка автоматически находит там сценарий, если в любом из каталогов, указанных до /home/user/bin
в переменной PATH
, нет другого исполняемого файла с именем hello
.
Команда echo широко применяется в сценариях оболочки для отображения информационных сообщений или сообщений об ошибках. Эти сообщения могут быть полезны для определения статуса выполнения сценария, и их можно направить в стандартный поток вывода или стандартный поток ошибок либо в log-файл для архивации. В случае отображения сообщений об ошибках рекомендуется направлять их в стандартный поток ошибок, чтобы было проще отличить сообщения об ошибках от обычных сообщений о состоянии.
[user@host ~]$
cat ~/bin/hello
#!/bin/bash echo "Hello, world" echo "ERROR: Houston, we have a problem." >&2[user@host ~]$
hello 2> hello.log
Hello, world[user@host ~]$
cat hello.log
ERROR: Houston, we have a problem.
Команда echo также может быть полезна при отладке неработающего сценария командной оболочки. Добавление инструкций echo в ту часть сценария, которая работает неправильно, поможет выяснить, какие команды выполняются, а также значения используемых переменных.
Ссылки
Man-страницы bash(1), magic(5), echo(1) и echo(1p)